/**
 * 文件预览相关工具函数
 */
import { getToken } from "@/utils/auth";

// 支持的文件类型数组
export const supportedTypes = [
  "docx",
  "xlsx",
  "xls",
  "pdf",
  "jpg",
  "jpeg",
  "png",
  "txt",
  "mp4",
  "mp3",
];

/**
 * 提取文件类型函数，通过文件路径获取文件扩展名
 * @param {string} path - 文件路径
 * @returns {string} 文件扩展名
 */
export const extractFileType = (path) => {
  const dotIndex = path.lastIndexOf(".");
  return dotIndex !== -1
    ? path.substring(dotIndex + 1).toLowerCase()
    : "unknown";
};

/**
 * 从文件路径中提取文件名
 * @param {string} path - 文件路径
 * @returns {string} 文件名
 */
export const extractFileName = (path) => {
  const lastSlashIndex = path.lastIndexOf("/");
  return lastSlashIndex !== -1 ? path.substring(lastSlashIndex + 1) : path;
};

/**
 * 验证URL是否有效的函数
 * @param {string} url - 需要验证的URL
 * @returns {boolean} URL是否有效
 */
export const isValidUrl = (url) => {
  const pattern = new RegExp(
    "^(https?:\\/\\/)?" + // 协议
      "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // 域名
      "((\\d{1,3}\\.){3}\\d{1,3}))" + // IP
      "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // 端口和路径
      "(\\?[;&a-z\\d%_.~+=-]*)?" + // 查询字符串
      "(\\#[-a-z\\d_]*)?$",
    "i"
  ); // 锚点
  return !!pattern.test(url);
};

/**
 * 封装fetch方法，通过文件路径获取二进制文件内容
 * @param {string} src - 文件路径
 * @param {boolean} useLocalToken - 是否使用本地token
 * @returns {Promise<ArrayBuffer>} 文件的ArrayBuffer
 */
export const getFileArrayBufferBySrc = async (src, useLocalToken = false) => {
  const headers = new Headers();
  if (useLocalToken) {
    headers.set("Authorization", `Bearer ${getToken()}`);
  }

  const res = await fetch(src, { headers });
  if (!res.ok) {
    throw new Error("Network response was not ok");
  }
  return await res.arrayBuffer();
};

/**
 * 处理文件列表，根据URL或对象生成统一的文件列表格式
 * @param {Array} srcList - 原始文件列表
 * @param {string} currentSrc - 当前文件路径
 * @returns {Array} 格式化后的文件列表
 */
export const processFileList = (srcList, currentSrc) => {
  // 如果srcList为空，则只显示当前src
  const list = srcList.length > 0 ? srcList : [currentSrc];

  return list.map((item) => {
    if (typeof item === "string") {
      return {
        name: extractFileName(item),
        src: item,
        filetype: extractFileType(item),
      };
    } else if (typeof item === "object" && item !== null && "src" in item) {
      const fileName = "name" in item ? item.name : "unknown";
      const fileType = extractFileType(item.src);
      return { name: fileName, src: item.src, filetype: fileType };
    }
  });
};

/**
 * 生成当前文件信息
 * @param {string} src - 文件路径
 * @returns {Object} 文件信息对象
 */
export const generateCurrentFile = (src) => {
  if (!src) {
    return { name: "暂无文件", src: "", filetype: "unknown" };
  }

  if (typeof src === "string") {
    return {
      name: extractFileName(src),
      src: src,
      filetype: extractFileType(src),
    };
  }

  return { name: "暂无文件", src: "", filetype: "unknown" };
};

/**
 * 下载文件
 * @param {string} fileSrc - 文件源路径
 * @param {string} fileName - 文件名
 */
export const downloadFile = (fileSrc, fileName) => {
  if (!isValidUrl(fileSrc)) {
    console.error("下载路径不正确.");
    return;
  }

  const headers = new Headers();
  headers.set("Authorization", `Bearer ${getToken()}`);
  headers.set("Content-Type", "application/x-www-form-urlencoded");

  fetch(fileSrc, {
    method: "GET",
    headers,
  })
    .then((response) => {
      if (!response.ok) {
        throw new Error("网络连接失败");
      }
      return response.blob();
    })
    .then((data) => {
      const reader = new FileReader();
      reader.readAsDataURL(data);
      reader.onloadend = function () {
        const a = document.createElement("a");
        a.href = reader.result;
        a.target = "_blank";
        a.rel = "noopenner noreferrer";
        a.download = fileName || extractFileName(fileSrc);
        a.click();
      };
    })
    .catch((error) => {
      console.error("下载失败:", error);
    });
};
